package com.ocn.li.scmdy.modules.app.utils;

import cn.hutool.core.util.ClassUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.ocn.li.scmdy.modules.app.entity.LiTestExcel;
import org.apache.commons.lang.ArrayUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

/**
 * @ClassName ImportExcelUtils
 * @Description TODO
 * @Author Li9527
 * @Date 2020/9/27 10:32
 * @Version 1.0
 */
public class ImportExcelUtils {

    /**
     * 读取excel表格内容返回List<Map>
     *
     * @param inputStream excel文件流
     * @param head        表头数组
     * @param headerAlias 表头别名数组
     * @return
     */
    public static List<Map<String, Object>> importExcelToMap(InputStream inputStream, String[] head, String[] headerAlias) {
        ExcelReader reader = ExcelUtil.getReader(inputStream);
        List<Object> header = reader.readRow(0);
        //替换表头关键字
        if (ArrayUtils.isEmpty(head) || ArrayUtils.isEmpty(headerAlias) || head.length != headerAlias.length) {
            return null;
        } else {
            for (int i = 0; i < head.length; i++) {
                if (head[i].equals(header.get(i))) {
                    reader.addHeaderAlias(head[i], headerAlias[i]);
                } else {
                    return null;
                }

            }
        }
        //读取指点行开始的表数据（以下介绍的三个参数也可以使用动态传入，根据个人业务情况修改）
        //0：表头所在行数  1：数据开始读取位置   Integer.MAX_VALUE:数据读取结束行位置
        List<Map<String, Object>> read = reader.read(0, 1, Integer.MAX_VALUE);
        return read;
    }

    /**
     * 读取excel表格内容返回List<Bean>
     *
     * @param inputStream excel文件流
     * @param head        表头数组
     * @param headerAlias 表头别名数组
     * @return
     */
    public static <T> List<T> importExcelToBean(InputStream inputStream, String[] head, String[] headerAlias, Class<T> bean) {
        ExcelReader reader = ExcelUtil.getReader(inputStream);
        List<Object> header = reader.readRow(0);
        //替换表头关键字
        if (ArrayUtils.isEmpty(head) || ArrayUtils.isEmpty(headerAlias) || head.length != headerAlias.length) {
            return null;
        } else {
            for (int i = 0; i < head.length; i++) {
                if (head[i].equals(header.get(i))) {
                    reader.addHeaderAlias(head[i], headerAlias[i]);
                } else {
                    return null;
                }

            }
        }
        //读取指点行开始的表数据（以下介绍的三个参数也可以使用动态传入，根据个人业务情况修改）
        //3：表头所在行数  1：数据开始读取位置   Integer.MAX_VALUE:数据读取结束行位置
        List<T> read = reader.read(0, 1, bean);
        return read;
    }


    public static void main(String[] args) {
        try {
            InputStream inputStream = new FileInputStream(new File("C:\\Users\\lijie\\Desktop\\测试excel.xls"));
            Field[] fields = ClassUtil.getDeclaredFields(LiTestExcel.class);
            String[] excelHeadAlias = new String[fields.length];
            for(int i=0;i<fields.length;i++){
                excelHeadAlias[i] = fields[i].getName();
            }
            String[] excelHead = {"所属网格", "房屋编号", "房屋地址", "建筑用途", "建筑面积（平方米）",
                    "房主姓名", "证件号码", "房主联系方式", "房主现居详址","是否为出租房" };
//            List<Map<String, Object>> result = ImportExcelUtils.importExcelToMap(inputStream, excelHead, excelHeadAlias);
            List<LiTestExcel> result = ImportExcelUtils.importExcelToBean(inputStream,excelHead, excelHeadAlias, LiTestExcel.class);
            System.out.println(result);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

}